#ifndef INDICE_SEC_H_
#define INDICE_SEC_H_

/**********************************************************************
 * indice_sec.h
 * 
 * Descripcion: Esta clase representa un indice secundario.
*********************************************************************/

#include "archivo.h"

class IndiceSec : public Archivo {

	//Atributos del indice sec
	protected:
		
		int num_campo_clave; //Numero del campo clave por el cual indexa el multi hash.
		
	public:
	
		IndiceSec(std::string& nombre, unsigned int tam_bloque, unsigned int tam_bloque_indice, unsigned int num_campo_clave);
	
		virtual ~IndiceSec(){}
		
		/*
		 * Crear: Crea el archivo, cargando el registro base del indice secundario. Recibe como
		 * param el string con el formato del reg del indice [tipo campo n, tipo campo 0].
		 */
		virtual void crear(std::string formato) throw(ExcepCreandoArch, ExcepSintaxisParser, ExcepBloqueTam) = 0;
 		
 		/*
 		 * Ingresar: Dado un registro completo, obtiene los campos necesarios para el
 		 * ind secundario, arma un nuevo registro y lo mete en el indice secundario.
 		 */
 		virtual void ingresar(TipoStruct * reg) throw(ExcepArchCerrado,ExcepRegExistente, ExcepBloqueTam) = 0;
		
		/*
		 * Quitar: Dado un registro del archivo principal, toma los campos necesarios y elimina
		 * la entrada del indice secundario.
		 */
		virtual void quitar(TipoStruct* reg) throw(ExcepArchCerrado) = 0;
		
		/*
		 * Consultar: Toma un vector de consultas, revisa q se consulte por el campo con el
		 * cual indexa el secundario, busca todos los regs q cumplan con ese criterio y los devuelve.
		 * Si no encontro ninguno devuelve el vector vacio.
		 * Devuelve true si se consulto por campo clave de reg secundario, false en caso contrario.
		 */
		virtual bool consultar(std::vector<ParesDatos*> &consultas, std::vector<TipoStruct*> &resultado)
									 throw(ExcepArchCerrado,ExcepLeerBloque) = 0;
									 
		/*
		 * Devuelve el numero de campo por el cual indexa el indice secundario.
		 */
		int get_numero_campo();
		
		/*
 		 * Devuelve la cantidad de registros del archivo de datos
 		 */ 										
 		virtual unsigned int get_cant_regs() throw(ExcepArchCerrado) = 0;
 		
};

#endif
